package com.shujia

class MyRichInt(int: Int) {
  def myMax(i: Int): Int = {
    if (int > i) {
      int
    } else {
      i
    }
  }

  def myMin(i: Int): Int = {
    if (int < i) {
      int
    } else {
      i
    }
  }
}

object Demo18Implicit01 {
  /**
   * 隐式转换：动态给某个对象增加方法
   *
   *
   */

  // 通过implicit关键字修饰的函数 即为隐式转换函数
  implicit def getRichInt(int: Int): MyRichInt = {
    new MyRichInt(int)
  }

  def func01(str: String): Int = {
    Integer.parseInt(str) + 200
  }

  // 在同一个作用域中，只能存在一个同类型的隐式转换函数
  implicit def intToString(i: Int): String = {
    String.valueOf(i)
  }


  def main(args: Array[String]): Unit = {
    // 手动进行调用
    val myRichInt: MyRichInt = new MyRichInt(10)
    println(myRichInt.myMax(100))
    println(myRichInt.myMin(100))

    // 手动借助getRichInt方法进行调用
    println(getRichInt(90).myMax(100))
    println(getRichInt(90).myMin(100))

    // 让Scala自动进行调用println(999.myMax(100))
    //    println(999.myMin(100))


    // 手动调用func01方法
    println(func01("100"))
    //     如果直接传入Int类型的值，会引发报错，因为func01要求的是接收一个String类型的参数
    //    println(func01(100))

    // intToString 可以实现将Int类型的值转换成String类型
    println(func01(intToString(100)))

    // 通过隐式转换 当类型不匹配时，自动去调用intToString方法
    println(func01(100))

  }

}
